# @Time    : 2022/8/24 14:52
# @Author  : 南黎
# @FileName: 把秘密写在照片里.py
import time

from  PIL import Image,ImageDraw,ImageFont
from PIL import Image,ImageFile

img_king_size = 20#像素放大尺寸，会影响大小
text = '发现你走远了'#输入文字内容
font = ImageFont.truetype('simsun.ttc',img_king_size)#设置字体

#导入图片，
#注意，这个图片有大小要求，我300Kb的图片变成了37mb，而且运行了很久，如果你的图片很大，python会报内存错误MemoryError
#但是像素点太少颜色对比不明显的图片虽然很快运行成功但是效果很差，不明显，所以要做好取舍。
#imgName=input("请输入图片名称：\n")
imgName = 'bigPhoto.jpg'

#打开图片
img = Image.open(imgName)
img_w,img_h = img.size

#创建一个小图，用于填充字体
img_child = Image.new("RGB", (img_king_size, img_king_size))
#创建一个大图，装备用来填充小图字体
img_ans = Image.new("RGB",(img_w * img_king_size,img_h * img_king_size))

#获取单个文字的宽和高
text_w,text_h = font.getsize('中')
#文字水平居中
offset_x = (img_king_size - text_w) >> 1
#文字垂直居中
offset_y = (img_king_size - text_h) >> 1

char_index = 0

draw = ImageDraw.Draw(img_child)#小图用于绘制文字

print("图片开始绘制，可能要很久，请耐心等待")
#遍历原图的每一个像素点，把像素点换为文字
for x in range(img_w):
    for y in range(img_h):
        #绘制背景，让图片更好看
        draw.rectangle((0,0,img_king_size,img_king_size),fill = 'lightgray')
        #用(x,y)处的像素点的色值进行绘制字体
        draw.text((offset_x,offset_y),text[char_index],font = font,fill = img.getpixel((x,y)))
        img_ans.paste(img_child,(x * img_king_size,y * img_king_size))
        char_index = (char_index + 1) % len(text)

timeNow=time.strftime("%Y-%m-%d-%H-%M-%S-",time.localtime(int(time.time())))#获取当前时间
img_ans.save("有秘密的-"+timeNow+imgName)
print("图片保存成功")

